package com.zsr.blob;

import com.zsr.preparedstatement.crud.PreparedStatementTest;
import com.zsr.utils.JDBCUtils;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 转账，事务测试
 */
public class testJDBCTransaction {

    @Test
    public void testTransaction() {
        Connection conn = null;

        try {
            //1.获取数据库连接
            conn = JDBCUtils.getConn();
            //2.开启事务
            conn.setAutoCommit(false);
            //3.进行数据库操作
            String sql1 = "update user_table set balance =balance - 100 where user = ?";
            update(conn,sql1,"AA");

            // 模拟网络异常
            //System.out.println(10 / 0);

            String sql2 ="update user_table set balance = balance + 100 where user = ?";
            update(conn,sql2,"BB");

            //4.若没有异常，则提交事务
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();
            //5.若有异常，则回滚事务
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally{
            try {
                //6.恢复没次DML操作的自动提交功能
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //7.关闭连接
            JDBCUtils.closeResource(conn,null,null);
        }
    }

    //使用事务以后的通用的增删改操作（version 2.0）
    public void update(Connection conn, String sql, Object... args) {
        PreparedStatement ps = null;
        try {
            // 1.获取PreparedStatement的实例 (或：预编译sql语句)
            ps = conn.prepareStatement(sql);
            // 2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            // 3.执行sql语句
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4.关闭资源
            JDBCUtils.closeResource(null, ps);
        }
    }
}
